package net.bitacademy.java22.service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import net.bitacademy.java22.domain.EventDAO;
import net.bitacademy.java22.domain.EventVO;
import net.bitacademy.java22.domain.ProfileDAO;
import net.bitacademy.java22.domain.ProfileVO;
import android.util.Log;

public class PascalEngine extends Thread {
	public static int statusFlag = 0;
	Trigger mParent;
	private EventVO[] evoStorage = null;
	private EventVO[] evoStorageTemp = null;
	
	public PascalEngine(Trigger parent) {
		mParent = parent;
	}
	
	public void run() {
		while (Trigger.run) {
			Log.d("PascalEngine", "PascalEngine is running");
			try {
				pascalEngineStream();
			} catch (Exception e) {
				e.printStackTrace();
			}
			try { Thread.sleep(10000);} catch (Exception e) { e.printStackTrace(); }
		}
	}
	
	public void pascalEngineStream() {
		Log.d("pascalEngineStream", "0 statusFlag"+Integer.toString(statusFlag));
		//if(evoStorage == null) {
		evoStorage=askEvent();
		if(evoStorage!=null)
			evoStorageTemp = evoStorage;
		else
			evoStorage = evoStorageTemp;
		//오늘 일정이 있는지 확인
		if(evoStorage!=null) {
			Log.d("pascalEngineStream", "오늘일정이 있는지 확인");
			EventVO evo = null;
			ProfileVO pvo = new ProfileVO();
			ProfileDAO pdao = new ProfileDAO(mParent);
			HwHandler hw = new HwHandler(mParent);
			SwHandler sw = new SwHandler();
			
			evo = filterEvent();
			//끝난 이벤트가 있는지 확인
			if(evo==null && statusFlag==1) {
				Log.d("pascalEngineStream", "A ==>> N  statusFlag"+Integer.toString(statusFlag));
				pvo = pdao.getCurrentHW();
				Log.d("pascalEngineStream", "pvo tagname "+pvo.getTag());
				hw.goHardwareSetting(pvo);
				pdao.deleteNormal(pvo);
				statusFlag=0;
				//지금시간과 비교해서 시작되야할 이벤트 있는지 확인
			} else if(cookingTime(evo.getStart()) && statusFlag==0) {
				Log.d("pascalEngineStream", "이벤트 시작시간이 현재시간보다 크면서 깃발이 0일경우");
				Log.d("pascalEngineStream", pdao.select());
				String[] tag=pdao.select().split(":");
				for(int i=0 ; i<tag.length ; i++) {
					Log.d("pascalEngineStream", "N ==>> A statusFlag"+Integer.toString(statusFlag));
					//태그값이 등록되어 있는것 중에 같은게 있는지 확인
					if(evo.getTag().equals(tag[i])) {
						Log.d("pascalEngineStream", "현재상태 저장하고 이벤트 상태로 변경");
						pvo = pdao.detail(evo.getTag());
						//현재상태값 저장
						hw.setCurrent();
						//프로필에 등록된값으로 세팅 변경
						hw.goHardwareSetting(pvo);
						sw.goSoftwareSetting(pvo);
						statusFlag=1;
						Log.d("pascalEngineStream", "3 statusFlag"+Integer.toString(statusFlag));
					}
				}
			}
		}
	}
	
	
	// 작성자 : 이현우
	// 내용 : 현재시간이 이벤트 시작시간과 끝시간 사이에 있는지 확인해서 그게 있다면 반환한다.
	// 마지막 업데이트 날짜 : 2012-3-13
	public EventVO filterEvent() {
		EventVO temp;
		SimpleDateFormat sdf= new SimpleDateFormat("HHmmss");
		Date now = new Date();
		int fnow = Integer.parseInt(sdf.format(now));
		
		for(int i=0 ; i< evoStorage.length ; i++) {
			temp = evoStorage[i];
			if(cookingTime2(temp.getStart()) <= fnow && fnow < cookingTime2(temp.getEnd())) {
				Log.d("pascalEngineStream", "filterEvent"+temp.getTag());
				return temp;
			}
		}
		return null;
	}
	
	// 작성자 : 이현우
	// 내용 : filterEvent에서 사용하려고 만든 시간을 다듬어줘서 반환하는 메소드
	// 마지막 업데이트 날짜 : 2012-3-13
	public int cookingTime2(String time) {
		String[] temp=time.substring(24, 32).split(":");
		String cooking="";
		for(int i=0 ; i<temp.length ; i++)
			cooking+=temp[i];
		return Integer.parseInt(cooking);
	}
	
	
	// 작성자 : 이현우
	// 내용 : 이벤트가 있는지 확인해서 저장한다.
	// 마지막 업데이트 날짜 : 2012-3-6
	public EventVO[] askEvent() {
		EventDAO edao= new EventDAO(mParent);
		ArrayList<EventVO> eventList = edao.statusList();
		if(eventList.size() == 0) {
			return null;
		}
		EventVO[] temp = new EventVO[eventList.size()];
		if(eventList!=null) {
			for(int i=0 ; i <eventList.size(); i++) {
				temp[i] = eventList.get(i);
				Log.d("askEvent()", temp[i].getTag()+", "+temp[i].getStart()+", "+temp[i].getEnd());
			}
			return temp;
		}
		return null;
	}
		
	// 작성자 : 이현우
	// 내용 : 구글에서 가져온 시간에서 시간부분만 편집해서 가져오는 메소드
	//		ex) {"dateTime":"2012-03-06T11:30:30.074+09:00"} 에서 113030 이렇게 추출
	// 마지막 업데이트 날짜 : 2012-3-6
	public boolean cookingTime(String time) {
		boolean abc=false;
		Log.d("cookingTime", "googleTIme : "+time);
		String[] temp=time.substring(24, 32).split(":");
		String cooking="";
		for(int i=0 ; i<temp.length ; i++)
			cooking+=temp[i];
		
		SimpleDateFormat sdf= new SimpleDateFormat("HHmmss");
		Date now = new Date();
		String fnow = sdf.format(now);
		Log.d("cookingTime", "cooking :" + cooking + "  now :" + fnow);
		if(Integer.parseInt(cooking)<=Integer.parseInt(fnow))
			abc=true;
		Log.d("cookingTime", "return : "+String.valueOf(abc));
		return abc;
	}
}


//	private boolean statusFlag = false;
//
//	ArrayList id = null;
//	String[] start = null;
//	String[] end = null;
//	String startId = null;
//	String endId = null;
//	HwHandler hw = null;
//	
//	EventImportTrigger mParent;
//
//	public PascalEngine(EventImportTrigger parent) {
//		mParent = parent;
//	}
//
//	public void run() {
//			Looper.prepare();
//			hw = new HwHandler(mParent);
//			
//			
//			while (EventImportTrigger.run) {
//				Log.d("PascalEngine", "PascalEngine is running");
//				try {
//					if (startTime() != null && statusFlag==false) {
//						Log.d("startTime", "OK");
//						
//						hw.currentSetValue(startId); //현재 setting값 DB에 저장
//						hw.HWsetting(startId); //H/W 셋팅하기 (태그에 해당하는 H/W셋팅값)
//						statusFlag=true;
//					}
//
//					if (endTime() != null && statusFlag) {
//						Log.d("endTime", "OK");
//						hw.restore(endId);//변경전 setting 값으로 H/W 셋팅하기
//						statusFlag=false;
//					}
//
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//				try {
//					Thread.sleep(10000);
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//		}
//		Looper.loop();
//	}
//
//	// EventDAO의 StatusList()호출. id,start,end,status 값을 각 배열에 담는다.
//	public void getStatusList() {
//		Log.d("getStatusList", "getStatusList()");
//		EventDAO edao = new EventDAO(mParent);
//		EventVO evo = null;
//
//		ArrayList statusList = edao.statusList();
//		id = new ArrayList();
//		start = new String[statusList.size()];
//		end = new String[statusList.size()];
//
//		for (int i = 0; i < statusList.size(); i++) {
//			evo = (EventVO) statusList.get(i);
//
//			id.add(evo.getId());
//			start[i] = (String) evo.getStart();
//			end[i] = (String) evo.getEnd();
//		}
//	}
//
//	// 현재 시간을 int 값으로 return
//	public int today() {
//		java.util.Calendar today = java.util.Calendar.getInstance();
//		int time = today.get(today.HOUR_OF_DAY) * 10000
//				+ today.get(today.MINUTE) * 100 + today.get(today.SECOND);
//		return time;
//	}
//
//	// start와 현재 시간을 비교하여 id 리턴
//	public String startTime() {
//
//		getStatusList();
//		String startTime = null;
//		String endTime = null;
//		int getStartTime = 0;
//		int getEndTime = 0;
//			for (int i = 0; i < start.length; i++) {
//				startTime = start[i].substring(24, 26)
//						+ start[i].substring(27, 29)
//						+ start[i].substring(30, 32);
//
//				endTime = end[i].substring(24, 26)
//						+ end[i].substring(27, 29)
//						+ end[i].substring(30, 32);
//				
//				getStartTime = Integer.parseInt(startTime);
//				getEndTime = Integer.parseInt(endTime);
//				if ((getStartTime <= today()) && (today() < getEndTime)) {
//					startId = (String) id.get(i);
//				}
//			}
//			return startId;
//	}
//
//	// end 현재 시간을 비교하여 id를 리턴
//	public String endTime() {
//
//		getStatusList();
//
//		String endTime = null;
//		int getTime = 0;
//
//			for (int i = 0; i < end.length; i++) {
//				endTime = end[i].substring(24, 26)
//						+ end[i].substring(27, 29)
//						+ end[i].substring(30, 32);
//
//				getTime = Integer.parseInt(endTime);
//				
//				if (getTime <= today()) {
//					endId = (String) id.get(i);
//				}
//			}
//			return endId;
//	}
//
//}
